Appearance
《C语言程序设计》第二学期重修试卷A (精选08)
一、单项选择题(本大题共10小题,每小题2分,共20分)
(1) 有以下语句:int a = 6; a += a -= a*a; printf("%d", a); 输出结果是(B)。
A. -132
B. -60
C. -24
D. 0
查看答案与解析
答案:B
解析: 复合赋值从右向左结合:
a -= a*a:a = 6 - 36 = -30a += a:a = -30 + (-30) = -60
难度: ⭐⭐⭐
考点: #复合赋值 #运算符结合性
💡 学习锦囊
📖 相关公式与知识点:
- 复合赋值运算符从右向左结合。
a += a -= a*a等价于a += (a -= (a*a))。
思路分析
按从右向左的顺序逐步计算。
🔄 举一反三
int a = 5; a += a *= 2;结果是多少?查看练习答案与解析
答案:20 解析:a *= 2 → a=10;a += 10 → a=20。
(2) 以下程序的输出结果是(D)。
main()
{
int a = 5, b = 4, c = 6, d;
printf("%d\n", d = a > b ? (a > c ? a : c) : b);
}2
3
4
5
A. 5
B. 4
C. 6
D. 3
查看答案与解析
答案:C(6)
解析: 嵌套条件表达式:
a > b=5 > 4= 真- 执行
a > c ? a : c=5 > 6 ? 5 : 6= 6
难度: ⭐⭐
考点: #条件表达式
💡 学习锦囊
📖 相关公式与知识点:
- 条件表达式:
条件 ? 表达式1 : 表达式2 - 可以嵌套使用。
思路分析
从内向外分析嵌套条件表达式。
🔄 举一反三
int max = a > b ? a : b;的功能是什么?查看练习答案与解析
答案:求 a 和 b 的最大值 解析:条件表达式常用于求最值。
(3) 以下程序的运行结果是(B)。
main()
{
int x = 2, y = -1, z = 2;
if (x < y)
if (y < 0)
z = 0;
else
z = z + 1;
printf("%d\n", z);
}2
3
4
5
6
7
8
9
10
A. 3
B. 2
C. 1
D. 0
查看答案与解析
答案:B(2)
解析:x < y = 2 < -1 = 假,所以内层 if 不执行,z 保持 2。
注意:else 与最近的 if 配对。
难度: ⭐⭐
考点: #if嵌套 #else配对
💡 学习锦囊
📖 相关公式与知识点:
- else 与最近的未配对的 if 配对。
思路分析
注意 else 的配对规则。
🔄 举一反三
- 若用花括号将内层 if-else 包裹,输出是多少?
查看练习答案与解析
答案:2(不变) 解析:花括号不影响外层 if 的条件判断,
x < y仍为假。
(4) 以下程序段的输出结果是(C)。
int n = 2;
while (n--);
printf("%d\n", n);2
3
A. 2
B. 1
C. -1
D. 0
查看答案与解析
答案:C
解析:n-- 先用后减:
- n=2:条件为真,n 变为 1
- n=1:条件为真,n 变为 0
- n=0:条件为假(0),但 n-- 仍会执行,n 变为 -1
循环结束,输出 n = -1。
难度: ⭐⭐⭐
考点: #自增自减 #while循环
💡 学习锦囊
📖 相关公式与知识点:
n--作为条件:先判断 n 的值,再自减。- 即使条件为假(n=0),n-- 仍会执行。
思路分析
注意后缀自减在条件中的行为。
🔄 举一反三
- 若将
while (n--)改为while (--n),输出是多少?查看练习答案与解析
答案:0 解析:n=2→--n=1 真; n=1→--n=0 假,循环结束,n=0。
(5) 以下程序段的输出结果是(A)。
int a = 0, b = 0, c = 0;
if (++a > 0 || ++b > 0)
++c;
printf("%d,%d,%d\n", a, b, c);2
3
4
A. 1,0,1
B. 1,1,1
C. 0,0,0
D. 0,1,1
查看答案与解析
答案:A
解析:++a > 0 = 1 > 0 = 真。由于 || 短路求值,右边 ++b > 0 不执行,b 保持 0。然后 ++c,c = 1。
结果:a=1, b=0, c=1
难度: ⭐⭐⭐
考点: #短路求值
💡 学习锦囊
📖 相关公式与知识点:
||短路:左边为真,右边不执行。&&短路:左边为假,右边不执行。
易错点
短路求值可能导致某些表达式不被执行。
🔄 举一反三
- 若将
||改为&&,输出是什么?查看练习答案与解析
答案:1,1,1 解析:
++a > 0=1 真,不短路,++b > 0=1 真,++c,a=1,b=1,c=1。
(6) 以下程序中,while 循环的循环次数是(D)。
main()
{
int i = 0;
while (i < 10)
{
if (i < 1)
continue;
if (i == 5)
break;
i++;
}
}2
3
4
5
6
7
8
9
10
11
12
A. 1
B. 10
C. 6
D. 死循环
查看答案与解析
答案:D
解析: 初始 i=0,进入循环。i < 1 为真,执行 continue,跳过 i++,回到 while 条件。i 始终为 0,死循环。
难度: ⭐⭐⭐
考点: #continue #死循环
💡 学习锦囊
📖 相关公式与知识点:
- continue 跳过循环体剩余部分,回到条件判断。
易错点
continue 会跳过循环变量更新,可能导致死循环。
🔄 举一反三
- 若将
if (i < 1) continue;改为if (i < 1) i++;,循环次数是多少?查看练习答案与解析
答案:10 次 解析:i 从 0 到 9,每次 i++ 正常递增,循环 10 次后 i=10 退出。
(7) 以下程序的运行结果是(A)。
main()
{
int a = 0, i;
for (i = 1; i < 5; i++)
{
switch (i)
{
case 0:
case 3: a += 2;
case 1:
case 2: a += 3;
default: a += 5;
}
}
printf("%d\n", a);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
A. 31
B. 13
C. 10
D. 20
查看答案与解析
答案:A
解析: 没有 break,发生穿透:
- i=1:case 1 → case 2 → default,a += 3 + 5 = 8
- i=2:case 2 → default,a += 3 + 5 = 16
- i=3:case 3 → case 1 → case 2 → default,a += 2 + 3 + 5 = 26
- i=4:default,a += 5 = 31
难度: ⭐⭐⭐
考点: #switch穿透
💡 学习锦囊
📖 相关公式与知识点:
- switch 穿透:匹配后无 break 则继续执行后续 case。
易错点
注意 case 的排列顺序和穿透效果。
🔄 举一反三
- 若在每个 case 后都加上
break;,a 的最终值是多少?查看练习答案与解析
答案:13 解析:i=1→case1→a+=3=3, break; i=2→case2→a+=3=6, break; i=3→case3→a+=2=8, break; i=4→default→a+=5=13。
(8) 以下程序的运行结果是(C)。
main()
{
int a = 1, b = 2, c = 3;
printf("%d\n", c > b > a);
}2
3
4
5
A. 2
B. 3
C. 0
D. 1
查看答案与解析
答案:C
解析:c > b > a 等价于 (c > b) > a = (3 > 2) > 1 = 1 > 1 = 0。
难度: ⭐⭐⭐
考点: #关系运算
💡 学习锦囊
📖 相关公式与知识点:
- 关系运算符是左结合的。
a > b > c等价于(a > b) > c。
易错点
C 语言不能连写关系表达式,必须用逻辑运算符连接。
🔄 举一反三
- 如何正确表达
a > b > c的数学含义?查看练习答案与解析
答案:
a > b && b > c解析:用逻辑与连接两个关系表达式。
(9) 以下函数调用语句中含有实参个数为(A)。
func((exp1, exp2), (exp3, exp4, exp5));A. 2
B. 5
C. 1
D. 3
查看答案与解析
答案:A
解析: 实参是两个逗号表达式:
(exp1, exp2):值为 exp2(exp3, exp4, exp5):值为 exp5
共 2 个实参。
难度: ⭐⭐
考点: #逗号表达式
💡 学习锦囊
📖 相关公式与知识点:
- 逗号表达式:
(a, b, c)的值为最后一个表达式的值(c)。
思路分析
注意区分逗号表达式和参数分隔符。
🔄 举一反三
int x = (1, 2, 3);后 x 的值是多少?查看练习答案与解析
答案:3 解析:逗号表达式取最后一个值。
(10) 以下程序段的输出结果是(C)。
int k, n, m;
n = 10; m = 1; k = 1;
while (k++ <= n)
m *= 2;
printf("%d\n", m);2
3
4
5
A. 512
B. 1024
C. 2048
D. 4096
查看答案与解析
答案:B(1024)
解析:k++ <= n:
- k=1:1<=10 真,k=2,m=2
- k=2:2<=10 真,k=3,m=4
- ...
- k=10:10<=10 真,k=11,m=1024
- k=11:11<=10 假,结束
m = 2^10 = 1024。
难度: ⭐⭐
考点: #while循环 #自增
💡 学习锦囊
📖 相关公式与知识点:
k++ <= n:先比较,后自增。
思路分析
注意 k++ 在条件中的行为。
🔄 举一反三
- 若将
k++ <= n改为++k <= n,m 的值是多少?查看练习答案与解析
答案:512 解析:k 从 2 到 10 共 9 次循环,m = 2^9 = 512。
二、填空题(本大题共10空,每空2分,共20分)
(1) C 语言表达式 5 > 2 > 7 > 8 的值是 0。
查看答案与解析
答案: 0
解析:5 > 2 > 7 > 8 = ((5 > 2) > 7) > 8 = (1 > 7) > 8 = 0 > 8 = 0。
难度: ⭐⭐
考点: #关系运算
💡 学习锦囊
📖 相关公式与知识点:
- 关系运算符左结合。
- 结果只有 0 或 1。
思路分析
不要按数学直觉理解连比。
🔄 举一反三
3 > 2 > 1的值是多少?查看练习答案与解析
答案:0 解析:
(3 > 2) > 1=1 > 1= 0。
(2) 以下程序的输出结果是 6。
main()
{
int i;
for (i = 1; i <= 5; i++)
;
printf("%d\n", i);
}2
3
4
5
6
7
查看答案与解析
答案: 6
解析: 循环体是空语句(分号)。i 从 1 到 5,每次加 1。当 i=6 时,条件 i <= 5 为假,循环结束。输出 i = 6。
难度: ⭐⭐
考点: #for循环 #空语句
💡 学习锦囊
📖 相关公式与知识点:
- for 循环体可以是空语句(只有一个分号)。
易错点
不要忽略空语句,它也是一个完整的循环体。
🔄 举一反三
- 若 for 循环体不是空语句而是
printf("%d ", i);,输出是什么?查看练习答案与解析
答案:1 2 3 4 5 6 解析:循环体执行 5 次输出 1-5,循环结束后输出 i=6。
(3) 以下程序段的输出结果是 **(2个*)。
int x = 2;
do
{
printf("*");
x--;
} while (!x == 0);2
3
4
5
6
查看答案与解析
答案: **
解析:
- 第一次:输出 *,x=1。
!x == 0=!1 == 0=0 == 0= 真,继续。 - 第二次:输出 *,x=0。
!x == 0=!0 == 0=1 == 0= 假,结束。
难度: ⭐⭐⭐
考点: #do-while #逻辑运算
💡 学习锦囊
📖 相关公式与知识点:
!优先级高于==。
思路分析
注意运算符优先级。
🔄 举一反三
- 若将
!x == 0改为!x = 0,会怎样?查看练习答案与解析
答案:编译错误 解析:
!x是右值,不能被赋值。
(4) 以下程序段的输出结果是 x=8。
int i, j, x = 0;
for (i = 0; i < 2; i++)
{
x++;
for (j = 0; j <= 3; j++)
{
if (j % 2)
continue;
x++;
}
x++;
}
printf("x=%d\n", x);2
3
4
5
6
7
8
9
10
11
12
13
查看答案与解析
答案: x=8
解析: 外层循环 2 次,每次:
- x++:x=1
- 内层 j=0,1,2,3:
- j=0:0%2=0,不 continue,x=2
- j=1:1%2=1,continue,跳过 x++
- j=2:2%2=0,不 continue,x=3
- j=3:3%2=1,continue,跳过 x++
- x++:x=4
第二次外层循环:x=8
难度: ⭐⭐⭐
考点: #嵌套循环 #continue
💡 学习锦囊
📖 相关公式与知识点:
- continue 只影响所在的最内层循环。
思路分析
逐层追踪循环变量。
🔄 举一反三
- 若将内层
if (j % 2) continue;改为if (j % 2 == 0) continue;,x 的值是多少?查看练习答案与解析
答案:x=8 解析:j=0,2 时 continue,j=1,3 时 x++,每轮内层 x 加 2,结果相同。
三、程序分析题(本大题共4小题,每小题5分,共20分)
(1) 以下程序的运行结果是 100,200,100,200。
int a1 = 100, a2 = 200;
main()
{
int a3 = 100, a4 = 200;
sub1(a3, a4);
sub1(a1, a2);
printf("%d,%d,%d,%d\n", a1, a2, a3, a4);
}
sub1(int x, int y)
{
a1 = x;
x = y;
y = a1;
}2
3
4
5
6
7
8
9
10
11
12
13
14
查看答案与解析
答案: 100,200,100,200
解析: sub1 是值传递,x 和 y 的改变不影响实参。
难度: ⭐⭐⭐
考点: #全局变量 #值传递
💡 学习锦囊
📖 相关公式与知识点:
- 值传递不改变实参。
思路分析
注意区分全局变量和局部变量。
🔄 举一反三
- 若 sub1 的参数改为指针
int *x, int *y,输出是什么?查看练习答案与解析
答案:200,100,200,100 解析:指针传递会修改实参的值。
(2) 以下程序的运行结果是 5。
main()
{
int a[5] = {1, 2, 3, 4, 5};
int *p = a;
printf("%d\n", *(p + 4));
}2
3
4
5
6
查看答案与解析
答案: 5
解析: p 指向数组首元素,p + 4 指向第 5 个元素(下标 4),即 a[4] = 5。
难度: ⭐
考点: #指针运算
💡 学习锦囊
📖 相关公式与知识点:
p + n指向第 n 个元素。
思路分析
指针加减按元素大小偏移。
🔄 举一反三
- 若
int *p = &a[2];,*(p - 1)的值是多少?查看练习答案与解析
答案:2 解析:p 指向 a[2]=3,p-1 指向 a[1]=2。
四、程序填充题(本大题共3小题,每小题6分,共18分)
(1) 将十个整数输入数组,求出其平均值并输出。
main()
{
int i, a[10], sum = 0;
int *p = a; /* 第一空 */
for (i = 0; i < 10; i++)
{
scanf("%d", p + i);
sum += *(p + i); /* 第二空 */
}
printf("%8.2f\n", (float)sum / 10); /* 第三空 */
}2
3
4
5
6
7
8
9
10
11
查看答案与解析
答案:
- 第一空:
a或&a[0] - 第二空:
*(p + i)或a[i] - 第三空:
(float)sum / 10
解析: 用指针遍历数组,计算平均值。注意类型转换。
难度: ⭐⭐
考点: #指针 #数组 #平均值
💡 学习锦囊
📖 相关公式与知识点:
- 平均值 = 总和 / 个数,注意类型转换。
思路分析
确保平均值计算时进行浮点除法。
🔄 举一反三
- 若要求平均值保留 1 位小数,printf 格式应如何修改?
查看练习答案与解析
答案:
printf("%8.1f\n", (float)sum / 10);解析:.1表示保留 1 位小数。
(2) 输入一个无符号整数后求出它的各位数之和并输出。
unsigned int f(unsigned int num)
{
unsigned int k = 0;
do
{
k += num % 10; /* 第二空 */
num /= 10;
} while (num); /* 第三空 */
return k;
}
main()
{
unsigned int n;
scanf("%d", &n);
printf("%u\n", f(n));
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
查看答案与解析
答案:
- 第一空:
unsigned int f(unsigned int num) - 第二空:
num % 10 - 第三空:
num或num != 0
解析: 通过取余和整除分离各位数字,累加求和。
难度: ⭐⭐
考点: #数位分离 #函数
💡 学习锦囊
📖 相关公式与知识点:
- 取个位:
num % 10 - 去掉个位:
num / 10
思路分析
用循环逐位分离并累加。
🔄 举一反三
- 若输入 12345,函数 f 的返回值是多少?
查看练习答案与解析
答案:15 解析:1+2+3+4+5=15。
(3) 为数组输入数据,逆序置换后输出。
#define N 8
main()
{
int i, j, t, a[N];
for (i = 0; i < N; i++)
scanf("%d", a + i);
i = 0; j = N - 1;
while (i < j)
{
t = *(a + i);
*(a + i) = *(a + j); /* 第一空 */
*(a + j) = t; /* 第二空 */
i++; /* 第三空 */
j--;
}
for (i = 0; i < N; i++)
printf("%5d", *(a + i));
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
查看答案与解析
答案:
- 第一空:
*(a + j) - 第二空:
*(a + j) = t - 第三空:
i++(或++i)
解析: 双指针法:i 从头,j 从尾,交换元素,向中间移动。
难度: ⭐⭐
考点: #数组逆序 #双指针
💡 学习锦囊
📖 相关公式与知识点:
- 逆序:首尾交换,向中间靠拢。
思路分析
注意循环终止条件和指针移动。
🔄 举一反三
- 若 N=5,输入 1 2 3 4 5,逆序后数组内容是什么?
查看练习答案与解析
答案:5 4 3 2 1 解析:首尾交换,a[0]↔a[4],a[1]↔a[3]。
五、程序设计题(第29小题7分,第30小题各10分,共17分)
(1) 将 100 个整数输入数组后按每行 10 个数输出。
查看答案与解析
参考答案:
#include <stdio.h>
main()
{
int a[100], i;
printf("请输入100个整数:\n");
for (i = 0; i < 100; i++)
scanf("%d", &a[i]);
for (i = 0; i < 100; i++)
{
printf("%5d", a[i]);
if ((i + 1) % 10 == 0)
printf("\n");
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
解析: 用循环控制输出格式,每输出 10 个数换一行。
难度: ⭐⭐
考点: #数组 #格式化输出
💡 学习锦囊
📖 相关公式与知识点:
- 换行条件:
(i + 1) % n == 0
思路分析
注意 i 从 0 开始,所以用 (i + 1) % 10 判断。
🔄 举一反三
- 若要求每行输出 5 个数,换行条件如何修改?
查看练习答案与解析
答案:
if ((i + 1) % 5 == 0) printf("\n");解析:将 10 改为 5 即可。
(2) 生成 Fibonacci 数列的前 20 项并输出。
查看答案与解析
参考答案:
#include <stdio.h>
main()
{
int f[20], i;
f[0] = 1;
f[1] = 1;
for (i = 2; i < 20; i++)
f[i] = f[i-1] + f[i-2];
printf("Fibonacci 数列前20项:\n");
for (i = 0; i < 20; i++)
{
printf("%8d", f[i]);
if ((i + 1) % 5 == 0)
printf("\n");
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
解析: Fibonacci 数列:1, 1, 2, 3, 5, 8, 13, ... 从第 3 项开始,每项等于前两项之和。
难度: ⭐⭐
考点: #Fibonacci数列 #递推
💡 学习锦囊
📖 相关公式与知识点:
- Fibonacci 递推公式:f[n] = f[n-1] + f[n-2]
- 初始条件:f[0] = f[1] = 1
思路分析
先初始化前两项,再用递推公式计算后续项。
易错点
- 注意初始条件的设置。
- 数组不要越界。
🔄 举一反三
- 如何用递归计算 Fibonacci 数列?
查看练习答案与解析
答案:
cint fib(int n) { if (n == 0 || n == 1) return 1; return fib(n-1) + fib(n-2); }1
2
3
4
5
6解析:递归方法简单但效率低,有大量重复计算。